SQL Injection
攻撃によってデータベースの不正利用をまねく可能性があるSQL文の組み立て方
発生しうる脅威
DBに蓄積された非公開情報の閲覧
個人情報の漏洩など
DBに蓄積された情報の改ざん、消去
ウェブページの改ざん、パスワード変更、システム停止など
認証回避による不正ログイン
ストアドプロシージャ等を利用したOSコマンドの実行
システムの乗っ取り、他の攻撃の踏み台としての悪用
SQL文の組み立てにはplaceholderを使う
例えば、http requestのqueryの値をSQLに埋め込むときなど
where postId = ${postId}のようなものを書く時にplaceholderを使う
静的プレースホルダー
こっちの方が安全
プレースホルダのままSQL文をコンパイルしておき、データベースエンジン側で値を割り当てる方式
https://www.ipa.go.jp/files/000017320.pdf 3.2
動的プレースホルダー
アプリケーション側のデータベース接続ライブラリ内で値をエスケープ処理してプレースホルダにはめ込む方式
https://www.ipa.go.jp/files/000017320.pdf 3.2
例
こういう埋め込みをしたい時に
code:sql
SELECT * FROM users WHERE id = '$id'
'; DELETE FROM users --という文字列をそのまま埋め込むと
code:sql
SELECT * FROM users WHERE id = ''; DELETE FROM users --'
となり、文法的に正しいSQLができる
--はコメントmrsekut.icon
これはuserstableの全recordを削除する
参考
/mrsekut-book-4797393165/174 (4.4 SQL呼び出しに伴う脆弱性)
https://blog.flatt.tech/entry/node_mysql_sqlinjection
https://www.slideshare.net/ockeghem/wasf2008
@orange_8361: Me: Making slides takes time
Also Me: Spend all day making memes
https://gyazo.com/0f9841e7f8bd6081e8db0f6fd6e37b09